import os
import time

from kdt.Kdt import Kdt
from parse.TestCaseParse import TestCaseParse


class Scheduler(object):
    """
        scheduler 调度器.程序从这里开始执行
    """
    def __init__(self, base_path):
        self.base_path = base_path
        self.kdt = Kdt()

    def run(self):
        # 获取所有的用例文件
        file_lst = self.list_file()
        # 把用例文件传递给解析器进行解析得到用例列表
        for filepath in file_lst:
            tc_lst = TestCaseParse.parse(filepath)
            # 利用反射从KDT对象中寻找keyword所对应的方法
            for tc in tc_lst:
                # step 每个用例的执行步骤 数据类型为列表
                step = tc.step
                for s in step: # s对应的是第一步,第二步..,第n步.它的数据类型也是列表
                    keyword = s[0]
                    how = s[1]
                    what = s[2]
                    # 用例中有些步骤所对应的列表长度只有3.取下标3会产生越界.
                    if len(s) > 3:
                        value = s[3]
                    else:
                        value = ''
                    if hasattr(self.kdt, str(keyword)):
                        func = getattr(self.kdt, str(keyword))
                        # 执行
                        func(how, what, value)
                        # 关键字所对应的KDT方法执行结束后.休眠1秒中!
                        time.sleep(1)
                    else:
                        print("没找到关键字!")

    def list_file(self):
        """
            遍历指定的目录得到该目录下的所有用例文件
            遍历dataset文件夹.获取该文件夹下所有的内容
            @:param basepath: 放置所有用例文件的根路径
        :return:
        """
        path_lst = []
        for root,dirs,files in os.walk(self.base_path):
            for file in files:
                if file.endswith("txt"):
                    path = os.path.join(self.base_path, file)
                    path_lst.append(path)
        return path_lst





if __name__ == "__main__":
    # 要想使用类中的方法需要通过构造类的实例来执行
    # 1.构建类的实例(实例就是对象的意思.构建实例的过程叫做实例化)
    sd = Scheduler(r"..\dataset")
    # 遥控器 操作 Schedule的实例(对象) 
    # 2.通过对象.方法来执行 类中声明好的行为
    sd.run()
    
    
    
    
    
    
    
    
    
    
    